#ifndef JSONTREEVIEW_H
#define JSONTREEVIEW_H

#include <QTreeView>
#include <QStandardItemModel>
#include <QAction>
#include <QMenu>

#include "tools/cJSON.h"
#include "components/myWidgets/DialogAddItem.h"
#include "components/DialogComponents.h"

// 弹出菜单
typedef struct 
{
    QMenu*    pProcMenu;        // 右键弹出菜单
    QAction*  pItemNew;         // 新增单项
    QAction*  pItemDel;         // 删除选定项
    QAction*  pItemRead2JSON;   // 本项转换为json文本
    QAction*  pItemTransfer;    // 本项转换为转义文本
    QAction*  pItemExpandAll;   // 展开树形图
    QAction*  pItemCollapseAll; // 收起树形图
}TREE_MENU;

class JSONTreeView : public QTreeView
{
    Q_OBJECT
public:
    // 构造函数
    JSONTreeView(QWidget *parent = nullptr);
    // 析构资源
    virtual ~JSONTreeView(){}
    // 获取原始数据
    bool getSourceData(std::string &strTextSrc);
    // 外部给入JSON文本并更新
    bool updateText(std::string &strContext);
    // 将树形图转换为json报文
    bool getTreeJson(std::string &strContext);
    // 清空树形图数据
    void clearAllData();

private slots:
    // 弹出右键菜单栏，并获取树形图位置
    void slt_treeMenu(const QPoint &pos);
    // 右键菜单动作：删除单条数据
    void slt_Action_ItemDel();
    // 右键菜单动作：添加单条数据
    void slt_Action_ItemAdd();
    // 右键菜单动作：将选中内容转换为JSON文本
    void slt_Action_ItemRead2JSON();
    // 右键菜单动作：将选中内容转换为已转义的JSON文本
    void slt_Action_ItemTransfer();
    // 展开所有节点
    void slt_Action_ExpandAll();
    // 收起所有节点
    void slt_Action_CollapseAll();
    // 根据弹出框输入内容将其加入树形图中
    void slt_addItem2Tree(uint iType, QString& strKey, QString& strValue);
    // 获取鼠标点击树形图的内容
    void slt_clicked(const QModelIndex &index);

private:
    // 逐个对象打印到树形图
    void printJson2Item(cJSON *pObj, QStandardItem *pItemParent);
    // 将树形图节点转为json报文输出
    bool getNodeItem2Json(const QModelIndex &curIndex, std::string &strJson, bool bFormat = true);
    // 将树形图节点添加到JSON节点上
    void printItem2Json(QStandardItem *item, cJSON *pObj);
    // 将树形图转换为json文本
    void readItem2Json(std::string &strCurJson);

private:
    bool                    m_bTextChanged;     // 文本发生改变
    QStandardItemModel*     m_pModel;           // 树形图模型
    DialogAddItem*          m_pDialogAddItem;   // 添加弹出窗口
    DialogOutput*           m_pDialogOutput;    // 文本展示窗口
    TREE_MENU               m_stMenu;           // 右键菜单
    std::string             m_strTextSrc;       // 原始数据
};

#endif // COMMONFUNC_H